package com.bytecodezz.app.sketch.common.base

import android.app.Application
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore
import androidx.multidex.MultiDex
import com.alibaba.android.arouter.launcher.ARouter
import com.bytecodezz.app.base.extend.function.logDebug
import com.bytecodezz.app.base.toolset.process.ProcessTools
import com.bytecodezz.app.sketch.common.BuildConfig
import com.bytecodezz.app.sketch.common.draw.DrawConfig


/**
 * @author: bytecodezz
 * @version: 1.0
 * @time: 2021/7/14 15:19
 * @package: com.bytecodezz.app.common.commonbase.base
 *
 * @description:
 *
 */

private const val USER_INFO_DATA_STORE_FILE_NAME = "user_info.pb"
private const val KEY_VALUE_FILE_NAME = "default_file"

class BaseApplication : Application(), Thread.UncaughtExceptionHandler {
    //用于存储普通键值对 扩展方法在 data包下的DataStoreExt里
    val Context.dataStore: DataStore<Preferences> by preferencesDataStore(KEY_VALUE_FILE_NAME)

    companion object {
        lateinit var application: BaseApplication
    }

    fun isDebug(): Boolean {
        return BuildConfig.DEBUG
    }

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        application = this
        MultiDex.install(this)
    }

    override fun onCreate() {
        super.onCreate()
        initCommonProcess()
        when (ProcessTools.getCurrentProcessName(this)) {
            "com.bytecodezz.app.sketch" -> initMainProcess()
            "com.bytecodezz.app.sketch:draw" -> initDrawProcess()
        }
    }


    /************************************** 公共进程资源初始化  **************************************/

    //初始化多进程公用资源
    private fun initCommonProcess() {
        logDebug("BaseApplication", "initCommonProcess")
        if (isDebug()) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效
            ARouter.openLog()     // 打印日志
            ARouter.openDebug()   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(this) // 尽可能早，推荐在Application中初始化
        //添加网络公共api接口
        initNetwork()
        //注册当前进程中的事件总线
//        EventBusInitializer.init(application)

    }

    //网络请求初始化全局配置
    private fun initNetwork() {
//        HttpManager.get.init(
//            baseUrl = CommonServiceURL.getBaseApiUrl(),
//            baseAPI = CommonApiService::class.java,
//            { builder: OkHttpClient.Builder ->
//                //添加网络请求重试拦截器，后面的函数参数控制当前次是否进行重试 根据其返回值而定
////                builder.addInterceptor(RetryInterceptor(3, { response: Response -> true }))
//                builder.addInterceptor(AppendCookiesInterceptor())
//                builder.addInterceptor(ParameterInterceptor())
//            },
//            { builder: Retrofit.Builder ->
//                builder.addConverterFactory(GsonConverterFactory.create())
//            })
    }


    /************************************** 主进程资源初始化  **************************************/
    //初始化主进程资源
    private fun initMainProcess() {
        logDebug("BaseApplication", "initMainProcess")
        //提前初始化Draw进程,防止第一次打开Draw页面进程慢，:draw
        DrawConfig.initProcess(this)
    }


    /************************************** :draw进程(Draw进程)资源初始化  **************************************/
    //初始化Draw进程资源
    private fun initDrawProcess() {
        logDebug("BaseApplication", "initDrawProcess")
    }

    //java全局异常捕获
    override fun uncaughtException(t: Thread, e: Throwable) {
        e.printStackTrace()
    }
}
